package com.zxtc.wh.utils;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 散列
 * 2017年4月27日14:21:00
 */
public class Encrypt {

    /**
     * 传入文本内容，返回 SHA-256 串
     *
     * @param strText
     * @return
     */
    public static String SHA256(final String strText) {
        return SHA(strText, "SHA-256");
    }

    /**
     * 返回输入流的 SHA-256 串
     *
     * @param inputStream
     * @return
     */
    public static String SHA256(final InputStream inputStream) {
        return SHA(inputStream, "SHA-256");
    }

    /**
     * 传入文本内容，返回 SHA-512 串
     *
     * @param strText
     * @return
     */
    public static String SHA512(final String strText) {
        return SHA(strText, "SHA-512");
    }

    /**
     * 字符串 SHA 加密
     *
     * @param strText 待散列的字符串
     * @param strType 散列的算法
     * @return
     */
    private static String SHA(final String strText, final String strType) {
        // 是否是有效字符串
        if (strText == null || strText.length() > 0) {
            return null;
        }


        // 返回值
        String strResult = null;
        try {
            // SHA 加密开始
            // 创建加密对象 并傳入加密類型
            MessageDigest messageDigest = MessageDigest.getInstance(strType);
            // 传入要加密的字符串
            messageDigest.update(strText.getBytes());
            // 得到 byte 類型结果
            byte byteBuffer[] = messageDigest.digest();

            // 將 byte 轉換爲 string
            StringBuffer strHexString = new StringBuffer();
            // 遍歷 byte buffer
            for (int i = 0; i < byteBuffer.length; i++) {
                String hex = Integer.toHexString(0xff & byteBuffer[i]);
                if (hex.length() == 1) {
                    strHexString.append('0');
                }
                strHexString.append(hex);
            }
            // 得到返回結果
            strResult = strHexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return strResult;
    }

    /**
     * 字符串 SHA 加密
     *
     * @param input   待散列的文件的缓冲流
     * @param strType 散列的算法
     * @return
     */
    private static String SHA(final InputStream input, final String strType) {
        // 返回值
        String strResult = null;

        // 是否是有效字符串
        try {
            // SHA 加密开始
            // 创建加密对象 并傳入加密類型
            MessageDigest messageDigest = MessageDigest.getInstance(strType);
            // 传入要加密的字符串


            BufferedInputStream buffer = new BufferedInputStream(input);
            byte[] buf = new byte[1024 * 8];

            int size;
            while (-1 != (size = buffer.read(buf, 0, 1024 * 8))) {
                messageDigest.update(buf, 0, size);
            }

            // 得到 byte 類型结果
            byte byteBuffer[] = messageDigest.digest();

            // 將 byte 轉換爲 string
            StringBuffer strHexString = new StringBuffer();
            // 遍歷 byte buffer
            for (int i = 0; i < byteBuffer.length; i++) {
                String hex = Integer.toHexString(0xff & byteBuffer[i]);
                if (hex.length() == 1) {
                    strHexString.append('0');
                }
                strHexString.append(hex);
            }
            // 得到返回結果
            strResult = strHexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return strResult;
    }
}